#pragma once

#include "noncopyable.h"
#include "Timestamp.h"

#include <vector>
#include <unordered_map>

class Channel;
class EventLoop;

// muduo库中多路事件分发器的核心IO复用模块
class Poller : noncopyable
{
public:
    // 用于存放活跃的通道
    using ChannelList = std::vector<Channel*>;

    // 构造函数，需要传入指向EventLoop的指针，表示这个Poller属于哪个事件循环。
    Poller(EventLoop *loop);
    virtual ~Poller() = default;

   // 给所有IO复用保留统一的接口
    virtual Timestamp poll(int timeoutMs, ChannelList *activeChannels) = 0;  // 上面有解释
    virtual void updateChannel(Channel *channel) = 0;
    virtual void removeChannel(Channel *channel) = 0;
    
    // 判断参数channel是否在当前Poller当中
    bool hasChannel(Channel *channel) const;

    // 创建并返回一个默认的IO复用实现的Poller对象。
    static Poller* newDefaultPoller(EventLoop *loop); // 在DefaultPoller.cc中实现,为什么?
protected:
    // 使用unordered_map存储文件描述符和对应的Channel对象的映射，快速访问和管理。
    using ChannelMap = std::unordered_map<int, Channel*>;
    ChannelMap channels_;
private:
    EventLoop *ownerLoop_; // 指向这个Poller所属的EventLoop的指针，确保Poller只服务于一个事件循环。
};
